package com.ysh.xiaomi.web.servelt;

import com.ysh.xiaomi.pojo.TbAddress;
import com.ysh.xiaomi.pojo.TbUser;
import com.ysh.xiaomi.service.UserService;
import com.ysh.xiaomi.service.impl.UserServiceImpl;
import com.ysh.xiaomi.utils.StringConstans;
import com.ysh.xiaomi.utils.StringUtils;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;
import java.util.concurrent.CompletableFuture;

/**
 * 袁胜虎 on 2022/8/15 17:03
 */
public class UserServlet  {
        /**
         * 添加用户操作
         * @param req
         * @param resp
         */
        UserService userService = new UserServiceImpl();
        public String register(HttpServletRequest req, HttpServletResponse resp){
            //按照我们的要求,将用户传递的数据获取过来, 包括用户名,密码,邮箱,性别
            //我们应该判断用户名,密码 邮箱 是否符合要求
            //判断用户名是不是已经存在
            //如果都符合了要求,才能添加数据
            //将密码转成md5散列值,碰撞重复.MD5不可逆转,信息熵太多,比如我有一个20gb的文件也可以计算出一个MD5
            //然后将数据保存到数据库
            //参数要求username,password,email,gender
            try {
                String username = req.getParameter("username");
                String password = req.getParameter("password");
                String email = req.getParameter("email");
                String gender = req.getParameter("gender");
                gender = new String(gender.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);
                System.err.println("gender--->"+gender);
                if (StringUtils.isEmpty(username) || !StringUtils.isLenghtEnough(username, 6)) {
                    req.setAttribute("exp", "用户名不符合要求");
                    //数据不对
//                 resp.sendRedirect("/error/error.jsp");
                    return StringConstans.FORWARD + "/error/error.jsp";
                }
                if (StringUtils.isEmpty(password) || !StringUtils.isLenghtEnough(password, 6)) {
                    req.setAttribute("exp", "密码不符合要求");
                    //数据不对
//                 resp.sendRedirect("/error/error.jsp");
                    return StringConstans.FORWARD + "/error/error.jsp";
                }
                if (!email.matches(StringConstans.EMAILREGE)) {
                    req.setAttribute("exp", "邮箱不符合要求");
                    //邮箱不符合要求
                    // resp.sendRedirect("/error/error.jsp");
                    return StringConstans.FORWARD + "/error/error.jsp";
                }
                System.err.println("数据校验没问题");
                //插入到数据库
                TbUser tbUser = new TbUser();
                tbUser.setPassword(password);
                tbUser.setEmail(email);
                tbUser.setUsername(username);
                tbUser.setGender(gender);
                userService.AddUser(tbUser);

            } catch (Exception e) {
                e.printStackTrace();
            }
            return StringConstans.REDIRECT + "/registerSuccess.jsp";
        }

        public String login(HttpServletRequest request,HttpServletResponse response){
            //登录,获取用户名和密码以及验证码,比较验证码
            String username = request.getParameter("username");
            String password = request.getParameter("password");
            String code = request.getParameter("code");
            //验证码为空就返回
            if (StringUtils.isEmpty(code)){
                request.setAttribute("exp","验证码为空");
                return  StringConstans.FORWARD + "/error/error.jsp";
            }
            //获取登录的时候保存的页面上面显示的验证码
            String  codeSave = (String) request.getSession().getAttribute("code");
            //我们的code只有一次有效,所以每次获取后都要移除
            request.getSession().removeAttribute("code");
            if (!code.equalsIgnoreCase(codeSave)){
                request.setAttribute("exp","验证码错误");
                return StringConstans.FORWARD + "/error/error.jsp";
            }
            //验证码没有问题,然后按照用户名进去查询
            TbUser user = userService.login(username, password);
            if (user != null){
                //保存数据到会话,下次判断是否登录用
                request.getSession().setAttribute("user", user);
                //登录的主要核心功能已经完成,我们有一个额外的要求,就是更新登录时间,但是登录时间更新成功与否不影响登录本身
                //所以我们可以在一个异步的子线程中执行更新操作
                CompletableFuture.runAsync(()->{
                    //更新登录时间,放到新的线程
                    userService.updateLoginTime(user.getId());
                });
                return  StringConstans.REDIRECT + "/index.jsp";
            }else {
                return StringConstans.REDIRECT + "/login.jsp";
            }


        }
}
